package com.snopy.socket;

import java.io.*;
import java.net.*;
import java.util.Date;

/**
 * @author snopy
 * @version 1.0.0
 * @classname QuoteServerThread
 * @description
 * @email 77912204@qq.com
 * @date 2022/08/01 18:24
 */
public class QuoteServerThread extends Thread{

    protected DatagramSocket socket = null;
    protected BufferedReader in = null;
    protected boolean moreQuotes = true;

    public QuoteServerThread() {
        this("QuoteServerThread");
    }
    public QuoteServerThread(String name){
        super(name);
        try {
            socket = new DatagramSocket(4445);
            URL url = new URL("https://docs.oracle.com/javase/tutorial/networking/datagrams/examples/one-liners.txt");

            in = new BufferedReader(new InputStreamReader(url.openStream()));

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void run() {
        while (moreQuotes) {
            try {
                byte[] buf = new byte[256];

                // receive request
                DatagramPacket packet = new DatagramPacket(buf, buf.length);
                socket.receive(packet);

                // figure out response
                String dString = null;
                if (in == null)
                    dString = new Date().toString();
                else
                    dString = getNextQuote();

                buf = dString.getBytes();

                // send the response to the client at "address" and "port"
                InetAddress address = packet.getAddress();
                int port = packet.getPort();
                packet = new DatagramPacket(buf, buf.length, address, port);
                socket.send(packet);
            } catch (IOException e) {
                e.printStackTrace();
                moreQuotes = false;
            }
        }
        socket.close();
    }

    protected String getNextQuote() {
        String returnValue = null;
        try {
            if ((returnValue = in.readLine()) == null) {
                in.close();
                moreQuotes = false;
                returnValue = "No more quotes. Goodbye.";
            }
        } catch (IOException e) {
            returnValue = "IOException occurred in server.";
        }
        return returnValue;
    }
}
